//
//  HomeTableViewController.swift
//  sinaWeiBo
//
//  Created by weixq on 15/7/29.
//  Copyright © 2015年 weixq. All rights reserved.
//

import UIKit

class HomeTableViewController: BaseTableViewController {

    var statuses: [Status]?{
        didSet {
            tableView.reloadData()
        }
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
       
        if !UserAccount.userLogon {
            
            visitorView?.setupViewInfo(true, imagehome: "visitordiscover_feed_image_smallicon", message: "关注一些人，回这里看看有什么惊喜")
            return
        }
        
        // 注册通知
        NSNotificationCenter.defaultCenter().addObserver(self, selector: "selectPicture:", name: HMstatusCellSelectPictureNotfication, object: nil)
        
        prepareTableView()
        
        // 获取数据
        loadData()

    }
    
    deinit {
        // 注销通hi
        NSNotificationCenter.defaultCenter().removeObserver(self)
    }

    // 选中照片的通知方法  n 通知对象
    @objc private func selectPicture(n: NSNotification) {
        
        // 获取参数 - 提示，从‘自定义’通知获取对象，一定记住坚持参数值
        // url
        guard let urls = n.userInfo![HMstatusCellSelectPictureRULKey] as? [NSURL] else {
            print("URL数组不存在")
            return
        }
        
        // indexPath 
        guard let indexpath = n.userInfo![HMstatusCellSelectPictureIndexkey] as? NSIndexPath else {
            print("indexPath 不存在")
            return
        }
        
        // 检查图像视图
        guard let picView = n.object as? StatusPictureView else {
            print("图像不存在")
            return
        }
        
        // 记录属性
        pictureView = picView
        // 设置转场动画的iconview
        presentIconView.sd_setImageWithURL(urls[indexpath.item])
        // 其实图片索引
        presentIndexpath = indexpath
        
        let vc = PhotoBrowserViewController(urls: urls, index: indexpath.item)
        
        // 自定义转场 transitioning
        // 默认的转场完成后，之前的view会被移除屏幕
        // 1. 指定代理
        vc.transitioningDelegate = self
        
        // 2. 指定modal转场模式 - 自定义
        vc.modalPresentationStyle = UIModalPresentationStyle.Custom
        
        
        presentViewController(vc, animated: true, completion: nil)
    }
    
    private func prepareTableView() {
        // 注册cell
        // rawVallue 返回枚举定义的值
        tableView.registerClass(StatusNormalCell.self, forCellReuseIdentifier: StatusCellIdentifier.NormalCell.rawValue)
        tableView.registerClass(statusForwardCell.self, forCellReuseIdentifier: StatusCellIdentifier.ForwardCell.rawValue)
        
        //设置预估行高
        tableView.estimatedRowHeight = 300
        
        //修改行高
        //        tableView.rowHeight = UITableViewAutomaticDimension
                tableView.rowHeight = 300
        
        // 取消分割线
        tableView.separatorStyle = UITableViewCellSeparatorStyle.None
        
        // 测试代码，刷新控件,高度是 60
        refreshControl = HMUIRefreshControl()
        
        // 添加监听方法
        refreshControl?.addTarget(self, action: "loadData", forControlEvents: UIControlEvents.ValueChanged)
      
    }
    
    // 上拉刷新标记
    private var pullupRefreshFlag = false
    
    // 加载数据
    func loadData() {
        
        // 开始动画 - 只是开启了动画，并不会开启加载数据
        refreshControl?.beginRefreshing()
        
        // 刷新微博，获取数组中第一条记录 id
        // 第一次执行此方法的时候，sstatues为空，since_id = 0， 加载最近的20条记录
        var since_id = statuses?.first?.id ?? 0
        
        // 判断是否是上啦刷新
        var max_id = 0
        if pullupRefreshFlag {
            since_id = 0
            max_id = statuses?.last?.id ?? 0
        }
     
        
        Status.loadStatus(since_id, max_id: max_id) { (datalist, error) -> () in
            
            // 关闭刷新控件， 结束刷新动画
            self.refreshControl?.endRefreshing()
            self.pullupRefreshFlag = false
            
            if error != nil {
                print(error)
                return
            }
            
            let count = datalist?.count
            print("刷新到了\(count)条数据")
            
            // 只有下拉刷新才有提示
            if since_id > 0 {
                self.showPulldownTip(count!)
            }
            
            if count == 0 {
                return
            }
            
            if since_id > 0 {
                print(since_id)
                self.statuses = datalist! + self.statuses!
            }else if max_id > 0 {
                self.statuses! += datalist!
             
            }else{
                self.statuses = datalist
            }
            
        }
    }
    
    private func showPulldownTip(count: Int){
        // uiview的动画值怎么实现的？是对核心动画的分装，添加到了layer上
        // 块代码动画中，修改frame本质上是修改position
        // 判断动画是否正在执行
        
        if tipLabel.layer.animationForKey("position") != nil {
            
            // 如果下拉两次非常短，‘通常‘不会有新微薄，即时有新微薄也只给一次提示
             return
        }
        
        // 定义标签 
        tipLabel.text = (count == 0) ? "暂时没有新的微博" : "刷新到\(count) 条微博"
        
        // 提示，如果拖拽的比较快，下一次动画的起点，是上一次动画的目标终点，造成提示栏不断向下
        let reck = tipLabel.frame
        UIView.animateWithDuration(2.0, animations: { () -> Void in
            
            // 自动反转动画
            UIView.setAnimationRepeatAutoreverses(true)
            
            // 移动label 的位置
            self.tipLabel.frame = CGRectOffset(reck, 0, 3 * reck.height)
            
            }) { (_) -> Void in
                self.tipLabel.frame = reck
        }
    }
    
    // MARK: - 懒加载
    private lazy var tipLabel: UILabel = {
        let h: CGFloat = 44
        let label = UILabel(frame: CGRect(x: 0, y: -2 * h, width: self.view.bounds.width, height: h))

        label.backgroundColor = UIColor.orangeColor()
        label.textColor = UIColor.whiteColor()
        label.textAlignment = NSTextAlignment.Center
        
        // 将label添加到view不合适，会一起滚动
        self.navigationController?.navigationBar.insertSubview(label, atIndex: 0)
        return label
    }()
    
    // 是否是modal 展现的标记
    private var isPresented = false
    // 动画转场过程中的图像视图
    private lazy var presentIconView: UIImageView = {
        let lv = UIImageView()
        
        lv.contentMode = UIViewContentMode.ScaleAspectFill
        lv.clipsToBounds = true
        
        return lv
    }()
    
    // 转场选中的图片 collectionview 可以计算起始位置和目标位置
    private var pictureView: StatusPictureView?
    // 转场起始的图片索引
    private var presentIndexpath: NSIndexPath?
    
    // MARK: - 数据源方法
    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return statuses?.count ?? 0
    }
    
    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        
        // 根据微博类型选择不同的id
        let status = statuses![indexPath.row]
        let cell = tableView.dequeueReusableCellWithIdentifier( StatusCellIdentifier.cellId(status), forIndexPath: indexPath) as! StatueCell
   
        // 判断indexpath 的值，如果是最后一条记录进行刷新
        if indexPath.row == statuses!.count - 1 {
            pullupRefreshFlag = true
            loadData()
        }
        
        cell.status = statuses![indexPath.row]
        
        return cell
    }
    
    override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
        
        let status = statuses![indexPath.row]
        
        if let h = status.rowHight {
            return h
        }
        
        let cell = tableView.dequeueReusableCellWithIdentifier(StatusCellIdentifier.cellId(status)) as? StatueCell
     
        return cell!.rowHeight(status)
    }

    
}



// 自定义转场的协议
extension HomeTableViewController: UIViewControllerTransitioningDelegate {

    // 返回提供转场动画的遵守 UIViewControllerAnimatedTransitioning 协议对象
    func animationControllerForPresentedController(presented: UIViewController, presentingController presenting: UIViewController, sourceController source: UIViewController) -> UIViewControllerAnimatedTransitioning? {
        
        isPresented = true
        return self
    }
    
    // 返回提供节操转场动画的对象
    func animationControllerForDismissedController(dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? {
        
        isPresented = false
        return self
    }
}

extension HomeTableViewController: UIViewControllerAnimatedTransitioning {
    // 转场动画时长
    func transitionDuration(transitionContext: UIViewControllerContextTransitioning?) -> NSTimeInterval {
        return 0.5
    }
    
    /**
        transitionContext   提供转场动画的元素
        completeTransition(true) 转场动画结束后必须调用
        containerView()  容器视图
    
        viewForKey       获取到转场的视图
    */
    
    func animateTransition(transitionContext: UIViewControllerContextTransitioning) {
      
//        let toVc = transitionContext.viewControllerForKey(UITransitionContextToViewControllerKey)
        
        if isPresented {
        
            // 最终要展现在界面上view，在动画结束之前不需要显示
            let toView = transitionContext.viewForKey(UITransitionContextToViewKey)!
            
            // 将动画的图像视图添加到目标视图中
            transitionContext.containerView()?.addSubview(presentIconView)
            
            // 指定图像视图其实位置
            let formRect = pictureView!.cellScreenFrame(presentIndexpath!)
            let toRect = pictureView!.cellFulScreenFrame(presentIndexpath!)
            
            // 起始位置
            presentIconView.frame = formRect
            
            UIView.animateWithDuration(transitionDuration(transitionContext), animations: { () -> Void in
                
                // 目标位置
                self.presentIconView.frame = toRect
                
                }) { (_) -> Void in
                    
                    // 删除动画的图像视图
                    self.presentIconView.removeFromSuperview()
                    
                    // 添加目标视图
                    transitionContext.containerView()?.addSubview(toView)
                    
                    // 动画结束之后，一定要执行,如果不执行，系统会一直等待，无法进行后续的交互！
                    transitionContext.completeTransition(true)
            }
            return
        }
        
        // 解除转场
        // 照片查看器的控制器
        let formVc = transitionContext.viewControllerForKey(UITransitionContextFromViewControllerKey) as! PhotoBrowserViewController
        // 从控制器获取当前显示的照片索引
        let indexPath = formVc.currentImageIndex()
        // 获取到微博cell中cellecitoncell对应的位置 
        let rect = pictureView!.cellScreenFrame(indexPath)
        
        // 照片视图，这个是整个uiview，显示图像的
        let fromView = transitionContext.viewForKey(UITransitionContextFromViewKey)!
        // 获取当前的图像视图,就是图像imageview
        let iv = formVc.currentImageView()
        
        // 设置图像视图的位置
        iv.center = fromView.center
        // 累加父视图的形变
        let scale = fromView.transform.a
        iv.transform = CGAffineTransformScale(iv.transform, scale, scale)
        
        // 将当前图像视图，添加到容器视图
        transitionContext.containerView()?.addSubview(iv)
        
        // 将fromview从容器视图中移出
        fromView.removeFromSuperview()
        
        UIView.animateWithDuration(transitionDuration(transitionContext), animations: { () -> Void in
           
            iv.frame = rect
        
            
            }, completion: { (_) -> Void in
                iv.removeFromSuperview()
                transitionContext.completeTransition(true)

        })
 
        
    }
}








